// 请求函数封装，具体看业务需求进行改进
import { Toast } from "@/utils/hack";
import { api_base_url, isDev } from "@/config/index";
import { AJAX_CODE } from "@/utils/constant"; // 常量
import store from "@/store/index";
import Router from "@/router/index";
// 记录请求的次数，和是否发生了401的请求
let rCounts = 0;
let isAuthExpire = false; // 是否返回过401或4011

const responseFuns = {
  200(response) {
    // 状态码是 200 的正常数据返回
    const res = response.data;
    if (response.config.isReturnAll) {
      return res;
    } else {
      if (res && res.Code === AJAX_CODE.SUCCESS && res.Data) {
        console.log(res);
        return res.Data;
      } else {
        console.log(res.Message);
        Toast(res.Message || "未知错误");
        return Promise.reject(res.Message || "未知错误");
      }
    }
  },
  500(response) {
    if (!isDev && Router.$Route.name !== "errorPage") {
      // Router.push({
      //   path: '/pages/errorPage/index', query: {
      //     code: 500
      //   }
      // })
    }
    console.warn("接口：", response.config.url, "的返回数据", response.data);
    return response.data;
  },
  404() {
    // 跳转到 404 页面 Todo
    if (!isDev && Router.$Route.name !== "errorPage") {
      // Router.push({
      //   path: '/pages/errorPage/index', query: {
      //     code: 404
      //   }
      // })
    }
  },
  // 授权错误
  401(response) {
    // 返回 401 并且 Code 401 的时候 清除token信息并跳转到登录页面
    var res = response.data;
    if (res.Code === AJAX_CODE.AUTH_EXPIRE) {
      return Promise.reject({
        Message: "401",
      }); // 跳转到授权地址，重新授权
    } else {
      Toast(res.Message);
      return Promise.reject(res);
    }
  },
};

// 请求拦截
async function interceptorsRequest(options) {
  // 不带域名的地址，默认使用baseURL
  let {
    url,
    header,
    isNeedAuth = true, // 接口默认都是需要鉴权的，如果不需要，则显式传入false
  } = options;
  options.isNeedAuth = isNeedAuth;
  // 如果是正在授权的过程中,则提前结束接口
  // 如果有主动退出登陆的标识,则不进行需要鉴权的请求
  if (options.isNeedAuth) {
    // 请求被拦截了，也需要修改isRequestedUserInfo的值
    store.commit("user/setIsRequestedUserInfo", true);
    throw {};
  }
  rCounts++;
  // 处理url
  if (!url.includes("//")) {
    options.url = api_base_url + url;
  }
  // 添加header
  if (!header) {
    options.header = {};
  }
  // 添加token
  if (!store.state.user.token) await store.dispatch("user/GetToken");
  const token = store.state.user.token;
  options.header["Authorization"] = `BEARER ${token}`;
  return options;
}

// 响应拦截
async function interceptorsResponse(err, response, options) {
  if (
    response.statusCode === 401 ||
    response.data.Code === AJAX_CODE.AUTH_EXPIRE
  ) {
    isAuthExpire = true;
  }
  rCounts--;
  // 最后一个请求返回了，且存在过期情况，则去重新授权
  if (isAuthExpire && rCounts === 0) {
    // 主动退出不授权
    // 重新授权
  }
  if (err) {
    return Promise.reject(err);
  }
  response.config = options;
  if (typeof responseFuns[response.statusCode] === "function") {
    return responseFuns[response.statusCode](response);
  } else {
    return Promise.reject(response);
  }
}

export default async function (options = {}) {
  try {
    // 添加请求拦截  star
    options = await interceptorsRequest(options);
    // 添加请求拦截  end
    const [err, response] = await uni.request(options);
    console.log("Request err", err, response);
    // 添加响应拦截 star
    return interceptorsResponse(err, response, options);
    // 添加响应拦截 end
  } catch (e) {
    return Promise.reject(e);
  }
}
